﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;

namespace iNet.Net
{
	/// <summary>
	/// 純文字網路文件下載工作。
	/// </summary>
	public class TextWebDocumentDownloadTask : WebDocumentDownloadTask
	{
		#region 欄位
		bool _DeleteLocalFile = true;
		Encoding _Encoding;
		string _Text;
		#endregion
		#region 建構子
		/// <summary>
		/// 初始化新的 TextWebDocumentDownloadTask 執行個體。
		/// </summary>
		public TextWebDocumentDownloadTask()
			: this(null, null)
		{ }
		/// <summary>
		/// 初始化新的 TextWebDocumentDownloadTask 執行個體。
		/// </summary>
		/// <param name="request">網路文字文件的伺服器請求。</param>
		public TextWebDocumentDownloadTask(WebRequest request)
			: this(request, null)
		{ }
		/// <summary>
		/// 初始化新的 TextWebDocumentDownloadTask 執行個體。
		/// </summary>
		/// <param name="request">網路文字文件的伺服器請求。</param>
		/// <param name="encoding">使用的文字編碼。</param>
		public TextWebDocumentDownloadTask(WebRequest request, Encoding encoding)
			: base(request)
		{
			_Encoding = encoding;
		}
		#endregion
		#region DeleteLocalFile
		/// <summary>
		/// 取得或設定讀取文字內容完成後，是否刪除已下載至本機的檔案，預設值為 True。
		/// </summary>
		public bool DeleteLocalFile
		{
			get
			{
				return _DeleteLocalFile;
			}
			set
			{
				this.SetInitializingParameter<bool>(ref _DeleteLocalFile, value);
			}
		}
		#endregion
		#region Encoding
		/// <summary>
		/// 取得或設定讀取文字內容所使用的編碼，設定為 Null (Visual Basic 為 Nothing) 表示由元件自行判定。
		/// </summary>
		public Encoding Encoding
		{
			get
			{
				return _Encoding;
			}
			set
			{
				this.SetInitializingParameter<Encoding>(ref _Encoding, value);
			}
		}
		#endregion
		#region Execute
		protected override bool Execute(Tasks.TaskVersion version)
		{
			//取得初始化參數
			bool deleteLocalFile;
			Encoding encoding;
			if (!this.ReadValue<bool>(version, ref _DeleteLocalFile, out deleteLocalFile) ||
				!this.ReadValue<Encoding>(version, ref _Encoding, out encoding))
				return true;

			//下載至本機
			if (!base.Execute(version))
				return false;
			
			//讀取文字
			try
			{
				//讀取文字
				string text;
				using (FileStream stream = new FileStream(this.LocalFileName, FileMode.Open, FileAccess.Read))
					text = this.ReadText(stream, encoding);

				//儲存結果
				this.WriteValue<string>(version, ref _Text, text);
			}
			catch
			{
				return false;
			}
			finally
			{
				//刪除本機檔案
				if (deleteLocalFile)
				{
					try
					{
						File.Delete(this.LocalFileName);
					}
					catch
					{ }
				}
			}

			//完成
			return true;
		}
		#endregion
		#region ReadText
		/// <summary>
		/// 從本機檔案中讀取字串。
		/// </summary>
		/// <param name="stream">本機檔案資料流。</param>
		/// <param name="encoding">使用的編碼，Null (Visual Basic 為 Nothing) 表示程式自行決定。</param>
		/// <returns>讀取的字串。</returns>
		protected virtual string ReadText(Stream stream, Encoding encoding)
		{
			//確認編碼
			if (encoding == null)
				encoding = StringUtility.GetEncoding(stream, Encoding.Default);

			//讀取文字
			using (StreamReader reader = new StreamReader(stream, encoding))
				return reader.ReadToEnd();
		}
		#endregion
		#region ResetOverride
		protected override void ResetOverride()
		{
			//呼叫基底
			base.ResetOverride();

			//重設參數
			_Text = null;
		}
		#endregion
		#region Text
		/// <summary>
		/// 取得已下載並讀取的文字內容。
		/// </summary>
		public string Text
		{
			get
			{
				return _Text;
			}
		}
		#endregion
	}
}
